From 4b202a1f902f67f54ae464251272c8325c0e9f15 Mon Sep 17 00:00:00 2001 From: "kaf24@firebug.cl.cam.ac.uk" Date: Thu, 18 May 2006 10:12:07 +0100 Subject: [PATCH] [NET] front: Network devices need to be freed by free_netdev not kfree. Also, fix some missing unwinds in error path. Still not convinced there aren't some lurking double free's in the error paths here. Signed-off-by: Stephen Hemminger --- .../drivers/xen/netfront/netfront.c | 34 ++++++++++--------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c b/linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c index 26e7764d90..3e9685bf02 100644 --- a/linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c +++ b/linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c @@ -223,7 +223,8 @@ static int __devinit netfront_probe(struct xenbus_device *dev, err = talk_to_backend(dev, info); if (err) { - kfree(info); + unregister_netdev(netdev); + free_netdev(netdev); dev->data = NULL; return err; } @@ -1101,11 +1102,11 @@ static int __devinit create_netdev(int handle, struct xenbus_device *dev, struct net_device *netdev = NULL; struct netfront_info *np = NULL; - if ((netdev = alloc_etherdev(sizeof(struct netfront_info))) == NULL) { + netdev = alloc_etherdev(sizeof(struct netfront_info)); + if (!netdev) { printk(KERN_WARNING "%s> alloc_etherdev failed.\n", __FUNCTION__); - err = -ENOMEM; - goto exit; + return -ENOMEM; } np = netdev_priv(netdev); @@ -1149,7 +1150,7 @@ static int __devinit create_netdev(int handle, struct xenbus_device *dev, printk(KERN_ALERT "#### netfront can't alloc rx grant refs\n"); gnttab_free_grant_references(np->gref_tx_head); err = -ENOMEM; - goto exit; + goto exit_free_tx; } netdev->open = network_open; @@ -1169,27 +1170,28 @@ static int __devinit create_netdev(int handle, struct xenbus_device *dev, if ((err = register_netdev(netdev)) != 0) { printk(KERN_WARNING "%s> register_netdev err=%d\n", __FUNCTION__, err); - goto exit_free_grefs; + goto exit_free_rx; } if ((err = xennet_proc_addif(netdev)) != 0) { unregister_netdev(netdev); - goto exit_free_grefs; + goto exit_free_rx; } np->netdev = netdev; - - exit: - if (err != 0) - kfree(netdev); - else if (val != NULL) + if (val) *val = netdev; - return err; - exit_free_grefs: - gnttab_free_grant_references(np->gref_tx_head); + return 0; + + + exit_free_rx: gnttab_free_grant_references(np->gref_rx_head); - goto exit; + exit_free_tx: + gnttab_free_grant_references(np->gref_tx_head); + exit: + free_netdev(netdev); + return err; } /* -- 2.30.2